home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / e / dclistview.lha / myreq2.e < prev    next >
Text File  |  1999-01-08  |  9KB  |  346 lines

  1. /* Original version by Jason                    **
  2. ** Some sections modified by Victor Ducedre,    **
  3. ** as indicated, for DCListview demo            */
  4.  
  5. OPT OSVERSION=37, PREPROCESS
  6.  
  7. -> Comment out this #define if you don't have/want to use sortlist.m
  8. #define SORTLIST
  9.  
  10. MODULE 'tools/EasyGUI', 'tools/exceptions', 'amigalib/lists', 'utility',
  11.        'gadtools', 'libraries/gadtools', 'exec/lists', 'exec/nodes',
  12.        'dos/dos', 'dos/exall', 'dos/dosextens', 'plugins/dclistview', 'utility/tagitem'
  13.  
  14. #ifdef SORTLIST
  15. MODULE '*sortlist'
  16. #endif
  17.  
  18. ENUM ERR_NONE, ERR_NEW, ERR_STR, ERR_LOCK, ERR_ADO, ERR_NODE, ERR_LIB, ERR_PATT,
  19.      ERR_OK, ERR_CANCEL
  20.  
  21. RAISE ERR_NEW  IF New()=NIL,
  22.       ERR_STR  IF String()=NIL,
  23.       ERR_LOCK IF Lock()=NIL,
  24.       ERR_ADO  IF AllocDosObject()=NIL,
  25.       ERR_LIB  IF OpenLibrary()=NIL,
  26.       ERR_PATT IF ParsePatternNoCase()=-1
  27.  
  28. #define DIRSTR '<DIR> '
  29. #define VOLSTR '<VOL> '
  30. #define ASNSTR '<ASN> '
  31. CONST DIRSTRLEN=6
  32.  
  33. CONST BUF_SIZE=1024, FILENAME_SIZE=300
  34. CONST PATTERNBUFF_SIZE=FILENAME_SIZE*2+2
  35. ENUM DIR_NODE, POS_NODE, VOL_NODE, ASN_NODE, FILE_NODE, MAX_TYPE
  36.  
  37. DEF pathStr[FILENAME_SIZE]:STRING, currPath[FILENAME_SIZE]:STRING,
  38.     fileStr[FILENAME_SIZE]:STRING, patternStr[FILENAME_SIZE]:STRING,
  39.     patternBuff[PATTERNBUFF_SIZE]:ARRAY,
  40.     pathGad, fileGad, patternGad,
  41.     nameList=NIL:PTR TO lh, posList=NIL:PTR TO lh
  42.  
  43. DEF gh=NIL:PTR TO guihandle,
  44.     dclist=NIL:PTR TO dclistview
  45.  
  46. -> Store the contents of path directory in list
  47. PROC getDir() HANDLE
  48.   DEF success, eacontrol=NIL:PTR TO exallcontrol, lock=NIL,
  49.       dlock=NIL, dl:PTR TO doslist, buffer[BUF_SIZE]:ARRAY, items=0
  50. #ifndef SORTLIST
  51.   freeNodes(nameList)
  52. #endif
  53. #ifdef SORTLIST
  54.   emptySortedList(nameList)
  55. #endif
  56.   IF currPath[]  -> Valid path
  57.     lock:=Lock(currPath, ACCESS_READ)
  58.     eacontrol:=AllocDosObject(DOS_EXALLCONTROL, NIL)
  59.     eacontrol.lastkey:=0
  60.     eacontrol.matchstring:=patternBuff
  61.     REPEAT
  62.       success:=ExAll(lock, buffer, BUF_SIZE, ED_TYPE, eacontrol)
  63.       IF eacontrol.entries<>0 THEN items:=items+addItems(buffer)
  64.     UNTIL success=FALSE
  65.   ELSE  -> Do a volume and assign list
  66.     dl:=(dlock:=LockDosList(LDF_VOLUMES OR LDF_ASSIGNS OR LDF_READ))
  67.     WHILE dl:=NextDosEntry(dl, LDF_VOLUMES OR LDF_ASSIGNS)
  68.       addEntry(BADDR(dl.name),IF dl.type=DLT_VOLUME THEN VOL_NODE ELSE ASN_NODE)
  69.       INC items
  70.     ENDWHILE
  71.   ENDIF
  72. #ifdef SORTLIST
  73.   IF items THEN makeSortedList(nameList, items, SIZEOF ln)  -> Sort it
  74. #endif
  75. EXCEPT DO
  76.   IF eacontrol THEN FreeDosObject(DOS_EXALLCONTROL, eacontrol)
  77.   IF lock THEN UnLock(lock)
  78.   IF dlock THEN UnLockDosList(LDF_VOLUMES OR LDF_ASSIGNS OR LDF_READ)
  79.   IF exception=ERR_LOCK
  80.     DisplayBeep(NIL)
  81.   ELSE
  82.     ReThrow()
  83.   ENDIF
  84. ENDPROC
  85.  
  86. -> Add a Dos List entry
  87. PROC addEntry(bname, type)
  88.   addNode(nameList, bname+1, type, 0, bname[])
  89. ENDPROC
  90.  
  91. -> Add the items from one call to ExAll
  92. PROC addItems(buffer)
  93.   DEF eabuf:PTR TO exalldata, items=0
  94.   eabuf:=buffer
  95.   WHILE eabuf
  96.     addNode(nameList, eabuf.name,
  97.             IF eabuf.type>0 THEN DIR_NODE ELSE FILE_NODE, 0)
  98.     INC items
  99.     eabuf:=eabuf.next
  100.   ENDWHILE
  101. ENDPROC items
  102.  
  103. -> Free a normal list of nodes and empty it
  104. PROC freeNodes(list:PTR TO lh)
  105.   DEF worknode:PTR TO ln, nextnode
  106.   worknode:=list.head  -> First node
  107.   WHILE nextnode:=worknode.succ
  108.     IF worknode.name THEN DisposeLink(worknode.name)
  109.     END worknode
  110.     worknode:=nextnode
  111.   ENDWHILE
  112.   newList(list)
  113. ENDPROC
  114.  
  115. -> Add a new node to the list
  116. PROC addNode(list, name, type, pri, len=0) HANDLE
  117.   DEF node=NIL:PTR TO ln, s=NIL
  118.   NEW node
  119.   IF name
  120.     SELECT MAX_TYPE OF type
  121.     CASE FILE_NODE
  122.       s:=StrCopy(String(StrLen(name)), name)
  123.     CASE DIR_NODE
  124.       s:=String(StrLen(name)+DIRSTRLEN)
  125.       StrCopy(s, DIRSTR)
  126.       StrAdd(s, name)
  127.     CASE VOL_NODE
  128.       s:=String(len+DIRSTRLEN+1)
  129.       StrCopy(s, VOLSTR)
  130.       StrAdd(s, name, len)
  131.       StrAdd(s, ':')
  132.     CASE ASN_NODE
  133.       s:=String(len+DIRSTRLEN+1)
  134.       StrCopy(s, ASNSTR)
  135.       StrAdd(s, name, len)
  136.       StrAdd(s, ':')
  137.     ENDSELECT
  138.   ENDIF
  139.   node.name:=s
  140.   node.type:=type
  141.   node.pri:=pri
  142.   AddTail(list, node)
  143. EXCEPT
  144.   IF node THEN END node
  145.   IF s THEN DisposeLink(s)
  146.   Throw(ERR_NODE, type)
  147. ENDPROC
  148.  
  149. -> Change the list to be a listing of volumes and assigns
  150. PROC volsList()
  151.   freeNodes(posList)
  152.   SetStr(currPath, 0)
  153.   changeList()
  154. ENDPROC
  155.  
  156. -> Add dir to path and change list
  157. PROC addDir(dir) HANDLE
  158.   addNode(posList, NIL, POS_NODE, EstrLen(currPath))
  159.   IF currPath[] AND (currPath[EstrLen(currPath)-1]<>":")
  160.     StrAdd(currPath, '/')
  161.   ENDIF
  162.   StrAdd(currPath, dir)
  163.   changeList()
  164. EXCEPT
  165.   -> Fix plist if exception not from first line (addNode to plist)
  166.   IF (exception<>ERR_NODE) OR (exceptioninfo<>POS_NODE) THEN parentPos()
  167.   ReThrow()
  168. ENDPROC
  169.  
  170. -> Set path to be its parent
  171. PROC parentPos()
  172.   DEF node:PTR TO ln
  173.   IF node:=RemTail(posList)
  174.     SetStr(currPath, node.pri)
  175.     END node
  176.     RETURN TRUE
  177.   ELSE
  178.     RETURN FALSE
  179.   ENDIF
  180. ENDPROC
  181.  
  182. -> Change the displayed list             ->*** modified for DCListview demo
  183. PROC changeList() HANDLE
  184.   -> Remove list
  185.   dclist.setA([DCLV_CURRENT,-1,
  186.                DCLV_LIST,-1,
  187.                TAG_DONE])
  188.   -> Change list contents
  189.   getDir()
  190. EXCEPT DO
  191.   setstr(gh, pathGad, currPath)
  192.   -> Reattach list
  193.   dclist.setA([DCLV_LIST,nameList,
  194.                DCLV_TOP,0,
  195.                TAG_DONE])
  196.   ReThrow()
  197. ENDPROC
  198.  
  199. -> Split path into directory positions
  200. PROC splitDir() HANDLE
  201.   DEF i
  202.   freeNodes(posList)
  203.   addNode(posList, NIL, POS_NODE, 0)
  204.   IF -1<>(i:=InStr(currPath, ':'))
  205.     IF currPath[i+1]
  206.       addNode(posList, NIL, POS_NODE, i+1)
  207.       WHILE -1<>(i:=InStr(currPath, '/', i+1))
  208.         addNode(posList, NIL, POS_NODE, i)
  209.       ENDWHILE
  210.     ENDIF
  211.   ENDIF
  212. EXCEPT
  213.   SetStr(currPath, 0)
  214. ENDPROC
  215.  
  216. -> Parse the directory from a lock, set up plist
  217. PROC setDir(lock)
  218.   IF NameFromLock(lock, pathStr, FILENAME_SIZE)
  219.     SetStr(pathStr, StrLen(pathStr))
  220.     StrCopy(currPath, pathStr)
  221.     splitDir()
  222.   ENDIF
  223. ENDPROC
  224.  
  225. -> Check this string is a real directory and set it
  226. PROC checkDir(dir) HANDLE
  227.   DEF lock=NIL, fib=NIL:PTR TO fileinfoblock
  228.   lock:=Lock(dir, ACCESS_READ)
  229.   fib:=AllocDosObject(DOS_FIB, NIL)
  230.   IF Examine(lock, fib)
  231.     IF fib.direntrytype>0
  232.       setDir(lock)
  233.       changeList()
  234.       Raise(ERR_NONE)  -> Finished, clean up
  235.     ENDIF
  236.   ENDIF
  237.   DisplayBeep(NIL)  -> Something minor went wrong...
  238. EXCEPT DO
  239.   IF fib THEN FreeDosObject(DOS_FIB, fib)
  240.   IF lock THEN UnLock(lock)
  241.   IF exception=ERR_LOCK
  242.     DisplayBeep(NIL)
  243.   ELSE
  244.     ReThrow()
  245.   ENDIF
  246. ENDPROC
  247.  
  248. PROC setPattern(s)
  249.   ParsePatternNoCase(s, patternBuff, PATTERNBUFF_SIZE)
  250.   changeList()
  251. ENDPROC
  252.  
  253.  
  254. -> GUI actions:
  255.  
  256. PROC a_pattern(info, str) IS setPattern(IF str[] THEN str ELSE '#?')
  257.  
  258. PROC a_path(info, str) IS checkDir(str)
  259.  
  260. PROC a_file(info, str) IS Raise(ERR_OK)
  261.  
  262. PROC a_list(info, list:PTR TO dclistview)->*** modified for DCListview demo
  263.   DEF node:PTR TO ln, sel, i=0
  264.   sel:=list.get(DCLV_CURRENT)
  265.   node:=nameList.head  -> First node
  266.   WHILE node.succ AND (i<sel)
  267.     node:=node.succ
  268.     INC i
  269.   ENDWHILE
  270.   IF node.type<>FILE_NODE
  271.     addDir(node.name+DIRSTRLEN)
  272.   ELSE
  273.     IF node.type=FILE_NODE THEN setstr(gh, fileGad, node.name)
  274.     IF list.get(DCLV_CLICK) THEN Raise(ERR_OK)  -> Double click on file
  275.   ENDIF
  276. ENDPROC
  277.  
  278. PROC b_ok(info) IS Raise(ERR_OK)
  279.  
  280. PROC b_cancel(info) IS Raise(ERR_CANCEL)
  281.  
  282. PROC b_vols(info) IS volsList()
  283.  
  284. PROC b_parent(info)
  285.   IF parentPos()
  286.     changeList()
  287.   ELSE
  288.     DisplayBeep(NIL)
  289.   ENDIF
  290. ENDPROC
  291.  
  292. -> GUI definition                        ->*** modified for DCListview demo
  293. PROC fileRequester()
  294.   easyguiA('Select a file:',
  295.     [EQROWS,
  296.       [DCLIST, {a_list},dclist, TRUE],  ->      NIL,13,10,nameList,0,NIL,0],
  297.       patternGad:=[STR,{a_pattern},'Pattern',patternStr,FILENAME_SIZE,5],
  298.       pathGad:=[STR,{a_path},'Drawer',pathStr,FILENAME_SIZE,5],
  299.       fileGad:=[STR,{a_file},'File',fileStr,200,5],
  300.       [EQCOLS,
  301.         [SBUTTON,{b_ok},'Ok'],
  302.         [SBUTTON,{b_vols},'Disks'],
  303.         [SBUTTON,{b_parent},'Parent'],
  304.         [SBUTTON,{b_cancel},'Cancel']
  305.       ]
  306.     ],[EG_GHVAR, {gh}, TAG_DONE]
  307.   )
  308. ENDPROC
  309.  
  310. PROC main() HANDLE                       ->*** modified for DCListview demo
  311.   DEF here=NIL
  312.   utilitybase:=OpenLibrary('utility.library', 37)
  313.   gadtoolsbase:=OpenLibrary('gadtools.library', 37)
  314.   NEW nameList, posList
  315.   newList(nameList)
  316.   newList(posList)
  317.   NEW dclist.dclistview([DCLV_RELX,13,
  318.                          DCLV_RELY,10,
  319.                          DCLV_LIST,nameList,
  320.                          DCLV_CURRENT,-1,
  321.                          TAG_DONE])
  322.   StrCopy(patternStr, '~(#?.info)')
  323.   ParsePatternNoCase(patternStr, patternBuff, PATTERNBUFF_SIZE)
  324.   here:=CurrentDir(NIL)
  325.   setDir(here)
  326.   CurrentDir(here)
  327.   getDir()
  328.   fileRequester()
  329. EXCEPT DO
  330.   END nameList, posList
  331.   IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
  332.   IF utilitybase THEN CloseLibrary(utilitybase)
  333.   SELECT exception
  334.   CASE ERR_OK
  335.     WriteF('User selected "\s\s\s"\n', currPath,
  336.        IF currPath[] AND (currPath[EstrLen(currPath)-1]<>":") THEN '/' ELSE '',
  337.        fileStr)
  338.   CASE ERR_CANCEL
  339.     WriteF('User cancelled requester\n')
  340.   DEFAULT
  341.     report_exception()
  342.   ENDSELECT
  343. ENDPROC
  344.  
  345. vers: CHAR 0, '$VER: myreq2 1.5 (8.1.99)', 0
  346.